#include <iostream>

// 适合使用constexpr的场景
// 数学常量
constexpr double PI = 3.14159265358979323846;

// 配置常量
constexpr int MAX_BUFFER_SIZE = 1024;

// 例子1 简单的constexpr变量
constexpr int MAX_SIZE = 100;
int array[MAX_SIZE]; // 编译器将直接将100插入到代码中

// 例子2 constexpr函数
constexpr int square(int n)
{
    return n * n;
}

constexpr int result = square(5);

int foo()
{
    return result;
}

class CircleCalculator
{
    // 编译期计算PI相关常量
    static constexpr double PI = 3.14159265358979323846;
    static constexpr double TWO_PI = 2 * PI;
    static constexpr double HALF_PI = PI / 2;

    // 编译期计算常用角度的正弦值
    static constexpr double SIN_45 = 0.70710678118; // sin(45度)

    // 这些值在编译时就被计算好，直接嵌入到代码中
    double calculateArea(double radius)
    {
        return PI * radius * radius; // PI直接被替换为常量
    }
};
